package tralala.server.remote;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;

import es.deusto.ingenieria.sd.util.observer.remote.IRemoteObserver;
import es.deusto.ingenieria.sd.util.observer.remote.RemoteObservable;
import tralala.data.dto.CancionAssembler;
import tralala.data.dto.CancionDTO;
import tralala.server.*;

public class TralalaManager extends UnicastRemoteObject implements ITralalaManager{
	
	TralalaService service;
	private RemoteObservable remoteObservable;
	private int numeroDeUsuarios=0;
	
	public TralalaManager(TralalaService ts) throws RemoteException
	{
		remoteObservable= new RemoteObservable();
		service= ts;
	}

	public boolean login(String u, String p) throws RemoteException{
		// TODO Auto-generated method stub
		System.out.println("[LOGIN]   Se quiere conectar el usuario "+u+" con contraseña "+p);
		boolean resultado= service.login(u, p);
		System.out.println("Resultado es: "+resultado);
		if(resultado)
		{
			numeroDeUsuarios++;
			notifyTotal(numeroDeUsuarios);
		}
		return resultado;
	}
	
	public void addRemoteObserver(IRemoteObserver arg0) throws RemoteException {
		this.remoteObservable.addRemoteObserver(arg0);
		
		try {
			arg0.update(new Integer(numeroDeUsuarios));
		} catch (RemoteException e) {
			System.err.println(" # Error al subscribir el observador remoto " + e.getMessage());
		}
		
	}

	public void deleteRemoteObserver(IRemoteObserver arg0)
			throws RemoteException {
			this.remoteObservable.deleteRemoteObserver(arg0);
	}
	
	private void notifyTotal(int x) {
		System.out.println("NUMERO DE USUARIO: "+x);
		this.remoteObservable.notifyRemoteObservers(new Integer(x));
	}

	public boolean desconectarUsuario(String u) throws RemoteException {
		numeroDeUsuarios--;
		notifyTotal(numeroDeUsuarios);
		service.desconectarUsuario(u);
		return true;
	}

	public List<CancionDTO> buscarCanciones(String s) throws RemoteException {
		System.out.println("Buscar ancion: Tralala Manager: "+s);
		CancionAssembler ca= new CancionAssembler();
		List<CancionDTO>list= ca.assemble(service.buscarCanciones(s));
		return list;
	}

	public CancionDTO seleccionarCancion(String s, String u) throws RemoteException {
		System.out.println("Seleccionar Canción: Tralala Manager: "+s);
		CancionAssembler ca= new CancionAssembler();
		return ca.assemble(service.buscarCancion(s,u));
	}

}
